﻿//#include "InstrumentedTimer.h"
#include "test.h"

// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170


// 宏定义
//#define print_start(str) std::cout << " ----------------- " << str << " Start ------------------------\n";
//#define print_end(str) std::cout << " ----------------- " << str << " End ------------------------\n\n\n";

/*
__cplusplus 宏的值在 C++11 及以后的标准中会反映标准版本。例如：
    C++11: __cplusplus 的值为 201103L
    C++14: __cplusplus 的值为 201402L
    C++17: __cplusplus 的值为 201703L
    C++20: __cplusplus 的值为 202002L
    不过在 MSVC 编译器中应该使用 _MSVC_LANG 宏来获取 C++ 语言版本。
*/

#if defined(_MSVC_LANG) && _MSVC_LANG >= 201703L  // 使用 MSVC 的宏
    #define USE_IN_CPP17
#elif __cplusplus >= 201703L
    // 使用 GCC, Clang, ICC 等的宏
    #define USE_IN_CPP17
//#else
    // 如果编译器不支持 C++17，提示或使用旧的文件系统 API
    //#error "需要 C++17 或更高版本"
#endif

#if defined(USE_IN_CPP17)
#include <filesystem>

void move_json_file() {
    namespace fs = std::filesystem;
    fs::path current_path = fs::current_path();
    fs::path json_directory = current_path / "json";

    // 如果目标目录不存在，则创建它
    if (!fs::exists(json_directory)) {
        fs::create_directory(json_directory);
    }

    // 遍历当前目录下的所有文件
    for (const auto & entry : fs::directory_iterator(current_path)) {
        if (entry.is_regular_file() && entry.path().extension() == ".json") {
            fs::path source_path = entry.path();
            fs::path destination_path = json_directory / source_path.filename();

            try {
                fs::rename(source_path, destination_path); // 移动文件
            }
            catch (const fs::filesystem_error & e) {
                std::cerr << "Error moving file: " << e.what() << '\n';
            }
        }
    }
}
#endif


int main()
{
    using namespace MyBaseTest;
    auto main_start = std::chrono::high_resolution_clock::now(); // get time timestamp now
#if PROFING
#pragma execution_character_set("utf-8")    // 设置编译环境为UTF-8编码，可用于网页显示中文
    test_progress(run_benchmarks, "测试：run_benchmarks", "run_benchmarks.json");
#pragma execution_character_set("gbk")  // 恢复编译环境为GBK编码
    // 警告： 'gbk' 不是受支持的参数： 当前仅支持"UTF-8"

    test_progress(test_newton_sqrt, "乱码测试：test_newton_sqrt", "test_newton_sqrt.json"); // 乱码，根据vs默认编码情况而定，utf-8不会乱码

#pragma execution_character_set("utf-8")    // 设置编译环境为UTF-8编码，可用于网页显示中文
    Instrumented::Singleton().BeginSession("可视化基准测试"); // 异步执行测试
    std::future<void> f1 = std::async(std::launch::async, run_benchmarks);
    std::future<void> f2 = std::async(test_newton_sqrt);
    f1.wait();
    f2.wait();
    Instrumented::Singleton().EndSession();

    Instrumented::Singleton().BeginSession("测试 test_two", "test_two.json"); // 同步执行测试
    run_benchmarks();
    Instrumented::Singleton().SetCurrentSessionName("测试 test_newton_sqrt.json");
    test_newton_sqrt();
    Instrumented::Singleton().EndSession();
#endif
    std::cout << "Main thread finished.\n";

    // 获取当前时间
    auto main_now = std::chrono::high_resolution_clock::now();
    // 计算时间差（微秒）
    auto main_duration = std::chrono::duration_cast<std::chrono::microseconds>(main_now - main_start);
    printf("Console print time used: %f seconds.\n", static_cast<float>(main_duration.count() / 1000000.0f));

#if defined(USE_IN_CPP17)
    move_json_file(); // 调用移动JSON文件的函数
#endif

    system("pause");
    return 0;
}